"""
类-封装、继承、多态
"""

class Person():
    name = "zhansgan"   #公有变量，默认的是public
    __age = 18          #私有变量

p = Person()
print(p.name)   #此时可以访问，因为name是public的
#print(p.__age)  #此时访问会报错，因为__age是私有变量
print(Person.__dict__)  #可以看到是将 __age 改名字了
print(p._Person__age) #此时可以访问


class Person():
    name = None
    __age = 18
    @staticmethod
    def sleep():
        print("sleeping...")

    @staticmethod
    def work():
        print("make some money")

#父类写在括号内：
class Teacher(Person):

    def work(self):
        super().work()
        #Person.work() #也可以使用这种方法
        print("I am teching...")

t = Teacher()
t.sleep()
t.work()

class Animal():
    pass

class BuruAnimal(Animal):
    def __init__(self):
        print("BuruAnimal")

class Dog(BuruAnimal):
    #构造函数
    def __init__(self):
        print("I am init dog")

class Cat(BuruAnimal):
    pass

d = Dog()   #子类中有自己的构造函数，所以调用子类的构造函数，而不会调用父类BuruAnimal的构造函数
c = Cat()   #子类中没有自己的构造函数，自动调用父类的构造函数

class Animal():
    pass

class BuruAnimal(Animal):
    def __init__(self, name):
        print("BuruAnimal:{0}".format(name))

class Dog(BuruAnimal):
    #构造函数
    def __init__(self):
        super().__init__("旺财")
        print("I am init dog")

class Cat(BuruAnimal):
    pass

d = Dog()   #此时调用没有问题，因为Dog类中有自己的构造函数
#c = Cat()   #此时会报错，由于Cat中没有自己的构造函数，它会去查找父类BuruAnimal的构造函数，而BuruAnimal的构造函数有自己的参数，所以需要传参进去
c = Cat("Kitty")
print(Cat.__mro__)  #查看所有父类


class Bird():
    def fly(self):
        print("I am flying")

class Fish():
    def swim(self):
        print("I am swimming")

class Person():
    def work(self):
        print("I am working")

class SuperMan(Person, Fish, Bird):
    pass

s = SuperMan()
s.fly()
s.work()
s.swim()

